Disclaimer: The purpose of the Open Case Studies project is to demonstrate the use of various data science methods, tools, and software in the context of messy, real-world data. A given case study does not cover all aspects of the research process, is not claiming to be the most appropriate way to analyze a given data set, and should not be used in the context of making policy decisions without external consultation from scientific experts.

This work is licensed under the Creative Commons Attribution-NonCommercial 3.0 (CC BY-NC 3.0) United States License.

To cite this case study please use:

Wright, Carrie and Ontiveros, Michael and Jager, Leah and Taub, Margaret and Hicks, Stephanie. (2020). https://github.com/opencasestudies/ocs-bp-co2-emissions. Exploring CO2 emissions across time (Version v1.0.0).

To access the GitHub repository for this case study see here: https://github.com//opencasestudies/ocs-bp-co2-emissions. This case study is part of a series of public health case studies for the Bloomberg American Health Initiative.

Motivation


Content Header


Content content

content header additional level


Content for quotes

for large images from the web… might do this instead:

[source]

To underline something:
Bold
Italics
underline and bold
underline and bold and italics

List:
1)makesure there are two spaces
2)after each item to create new line

Yanosky, J. D. et al. Spatio-temporal modeling of particulate air pollution in the conterminous United States using geographic and meteorological predictors. Environ Health 13, 63 (2014).

Main Questions


Our main question:

  1. Question 1
  2. Question 2 etc.

Learning Objectives


In this case study, we will explore CO2 emission data from around the world. We will also focus on the US specifically to evaluate patterns of temperatures and natural disaster activity.

This case study will particularly focus on how to use different datasets that span different ranges of time, as well as how to create visualizations of patterns over time. We will especially focus on using packages and functions from the tidyverse, such as dplyr, tidyr, and ggplot2.

The tidyverse is a library of packages created by RStudio. While some students may be familiar with previous R programming packages, these packages make data science in R especially legible and intuitive.

The skills, methods, and concepts that students will be familiar with by the end of this case study are:

Data Science Learning Objectives:

  1. Importing data from various types of Excel files and CSV files
  2. Apply action verbs in dplyr for data wrangling
  3. How to pivot between “long” and “wide” datasets
  4. Joining together multiple datasets using dplyr
  5. How to create effective longitudinal data visualizations with ggplot2
  6. How to add text, color, and labels to ggplot2 plots
  7. How to create faceted ggplot2 plots

Statistical Learning Objectives:

  1. Introduction to correlation coefficient as a summary statistic
  2. Relationship between correlation and linear regression
  3. Correlation is not causation


We will begin by loading the packages that we will need:

library(here)
library(readr)
library(dplyr)
Package Use
here to easily load and save data
readr to import the CSV file data

The first time we use a function, we will use the :: to indicate which package we are using. Unless we have overlapping function names, this is not necessary, but we will include it here to be informative about where the functions we will use come from.

Context


Limitations


There are some important considerations regarding this data analysis to keep in mind:

  1. Limitation 1

  2. Limitaiton 2

What are the data?


If you want to make a table about variable info:

Variable Details
variable1 Variable info
– more details
– more detials
Example: Content content
variable2 Variable info
– more details
– more detials
Example: Content content

Data Import


Put files in docs directory and use here package.

pm <-readr::read_csv(here("docs", "pm25_data.csv"))

Data Exploration and Wrangling


We will also use the %>% pipe which can be used to define the input for later sequential steps. This will make more sense when we have multiple sequential steps using the same data object. To use the pipe notation we need to install and load dplyr as well.

Can add DT tables too- note that you can`t use these inside a click expand details section.

library(DT)
DT::datatable(iris)

Scrollable content:

# Scroll through the output!
pm %>% 
  distinct(state) %>%
  print(n = 1e3)
# A tibble: 49 x 1
   state               
   <chr>               
 1 Alabama             
 2 Arizona             
 3 Arkansas            
 4 California          
 5 Colorado            
 6 Connecticut         
 7 Delaware            
 8 District Of Columbia
 9 Florida             
10 Georgia             
11 Idaho               
12 Illinois            
13 Indiana             
14 Iowa                
15 Kansas              
16 Kentucky            
17 Louisiana           
18 Maine               
19 Maryland            
20 Massachusetts       
21 Michigan            
22 Minnesota           
23 Mississippi         
24 Missouri            
25 Montana             
26 Nebraska            
27 Nevada              
28 New Hampshire       
29 New Jersey          
30 New Mexico          
31 New York            
32 North Carolina      
33 North Dakota        
34 Ohio                
35 Oklahoma            
36 Oregon              
37 Pennsylvania        
38 Rhode Island        
39 South Carolina      
40 South Dakota        
41 Tennessee           
42 Texas               
43 Utah                
44 Vermont             
45 Virginia            
46 Washington          
47 West Virginia       
48 Wisconsin           
49 Wyoming             

To make click expand section use:

Click here to see more info

text text

Note!!! You cannot use scroll features inside detail sections unless it is the last header section! Otherwise it will cause the other headers to be missing and other issues.

You can still do this if you leave an open details section like this and then have a section header at the same level as this section:

Click here to see more info

text text

Scrollable content:

# Scroll through the output!
pm %>% 
  distinct(state) %>%
  print(n = 1e3)
# A tibble: 49 x 1
   state               
   <chr>               
 1 Alabama             
 2 Arizona             
 3 Arkansas            
 4 California          
 5 Colorado            
 6 Connecticut         
 7 Delaware            
 8 District Of Columbia
 9 Florida             
10 Georgia             
11 Idaho               
12 Illinois            
13 Indiana             
14 Iowa                
15 Kansas              
16 Kentucky            
17 Louisiana           
18 Maine               
19 Maryland            
20 Massachusetts       
21 Michigan            
22 Minnesota           
23 Mississippi         
24 Missouri            
25 Montana             
26 Nebraska            
27 Nevada              
28 New Hampshire       
29 New Jersey          
30 New Mexico          
31 New York            
32 North Carolina      
33 North Dakota        
34 Ohio                
35 Oklahoma            
36 Oregon              
37 Pennsylvania        
38 Rhode Island        
39 South Carolina      
40 South Dakota        
41 Tennessee           
42 Texas               
43 Utah                
44 Vermont             
45 Virginia            
46 Washington          
47 West Virginia       
48 Wisconsin           
49 Wyoming             

Data Visualization


Data Analysis


content header


content header additional level


Summary


Synopsis


Summary Plot


Suggested Homework


Additional Information


Session Info


library(devtools)
session_info()
─ Session info ───────────────────────────────────────────────────────────────
 setting  value                       
 version  R version 4.0.3 (2020-10-10)
 os       macOS Mojave 10.14.6        
 system   x86_64, darwin17.0          
 ui       X11                         
 language (EN)                        
 collate  en_US.UTF-8                 
 ctype    en_US.UTF-8                 
 tz       America/New_York            
 date     2021-07-23                  

─ Packages ───────────────────────────────────────────────────────────────────
 package     * version date       lib source                            
 assertthat    0.2.1   2019-03-21 [1] CRAN (R 4.0.0)                    
 bslib         0.2.5.1 2021-05-18 [1] CRAN (R 4.0.2)                    
 cachem        1.0.5   2021-05-15 [1] CRAN (R 4.0.2)                    
 callr         3.7.0   2021-04-20 [1] CRAN (R 4.0.2)                    
 cli           3.0.0   2021-06-30 [1] CRAN (R 4.0.2)                    
 crayon        1.4.1   2021-02-08 [1] CRAN (R 4.0.3)                    
 crosstalk     1.1.1   2021-01-12 [1] CRAN (R 4.0.2)                    
 DBI           1.1.1   2021-01-15 [1] CRAN (R 4.0.2)                    
 desc          1.3.0   2021-03-05 [1] CRAN (R 4.0.2)                    
 devtools    * 2.4.2   2021-06-07 [1] CRAN (R 4.0.2)                    
 digest        0.6.27  2020-10-24 [1] CRAN (R 4.0.2)                    
 dplyr       * 1.0.7   2021-06-18 [1] CRAN (R 4.0.2)                    
 DT          * 0.18    2021-04-14 [1] CRAN (R 4.0.2)                    
 ellipsis      0.3.2   2021-04-29 [1] CRAN (R 4.0.2)                    
 evaluate      0.14    2019-05-28 [1] CRAN (R 4.0.0)                    
 fansi         0.5.0   2021-05-25 [1] CRAN (R 4.0.2)                    
 fastmap       1.1.0   2021-01-25 [1] CRAN (R 4.0.2)                    
 fs            1.5.0   2020-07-31 [1] CRAN (R 4.0.2)                    
 generics      0.1.0   2020-10-31 [1] CRAN (R 4.0.2)                    
 glue          1.4.2   2020-08-27 [1] CRAN (R 4.0.2)                    
 here        * 1.0.1   2020-12-13 [1] CRAN (R 4.0.2)                    
 highr         0.9     2021-04-16 [1] CRAN (R 4.0.2)                    
 hms           1.1.0   2021-05-17 [1] CRAN (R 4.0.2)                    
 htmltools     0.5.1.1 2021-01-22 [1] CRAN (R 4.0.2)                    
 htmlwidgets   1.5.3   2020-12-10 [1] CRAN (R 4.0.2)                    
 jquerylib     0.1.4   2021-04-26 [1] CRAN (R 4.0.2)                    
 jsonlite      1.7.2   2020-12-09 [1] CRAN (R 4.0.2)                    
 knitr       * 1.33.6  2021-06-17 [1] Github (yihui/knitr@11eeb43)      
 lifecycle     1.0.0   2021-02-15 [1] CRAN (R 4.0.2)                    
 magrittr      2.0.1   2020-11-17 [1] CRAN (R 4.0.2)                    
 memoise       2.0.0   2021-01-26 [1] CRAN (R 4.0.2)                    
 pillar        1.6.1   2021-05-16 [1] CRAN (R 4.0.2)                    
 pkgbuild      1.2.0   2020-12-15 [1] CRAN (R 4.0.2)                    
 pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.0.0)                    
 pkgload       1.2.1   2021-04-06 [1] CRAN (R 4.0.2)                    
 prettyunits   1.1.1   2020-01-24 [1] CRAN (R 4.0.0)                    
 processx      3.5.2   2021-04-30 [1] CRAN (R 4.0.2)                    
 ps            1.6.0   2021-02-28 [1] CRAN (R 4.0.2)                    
 purrr         0.3.4   2020-04-17 [1] CRAN (R 4.0.0)                    
 R6            2.5.0   2020-10-28 [1] CRAN (R 4.0.2)                    
 readr       * 1.4.0   2020-10-05 [1] CRAN (R 4.0.2)                    
 remotes       2.4.0   2021-06-02 [1] CRAN (R 4.0.2)                    
 rlang         0.4.11  2021-04-30 [1] CRAN (R 4.0.2)                    
 rmarkdown     2.9.1   2021-06-17 [1] Github (rstudio/rmarkdown@bafed5e)
 rprojroot     2.0.2   2020-11-15 [1] CRAN (R 4.0.2)                    
 rstudioapi    0.13    2020-11-12 [1] CRAN (R 4.0.2)                    
 sass          0.4.0   2021-05-12 [1] CRAN (R 4.0.2)                    
 sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 4.0.2)                    
 stringi       1.6.2   2021-05-17 [1] CRAN (R 4.0.2)                    
 stringr       1.4.0   2019-02-10 [1] CRAN (R 4.0.0)                    
 testthat      3.0.4   2021-07-01 [1] CRAN (R 4.0.2)                    
 tibble        3.1.2   2021-05-16 [1] CRAN (R 4.0.2)                    
 tidyselect    1.1.1   2021-04-30 [1] CRAN (R 4.0.2)                    
 usethis     * 2.0.1   2021-02-10 [1] CRAN (R 4.0.2)                    
 utf8          1.2.1   2021-03-12 [1] CRAN (R 4.0.2)                    
 vctrs         0.3.8   2021-04-29 [1] CRAN (R 4.0.2)                    
 withr         2.4.2   2021-04-18 [1] CRAN (R 4.0.2)                    
 xfun          0.24    2021-06-15 [1] CRAN (R 4.0.2)                    
 yaml          2.2.1   2020-02-01 [1] CRAN (R 4.0.0)                    

[1] /Library/Frameworks/R.framework/Versions/4.0/Resources/library

Acknowledgments


LS0tCnRpdGxlOiAiT3BlbiBDYXNlIFN0dWRpZXMgOiBUaXRsZSAiCmNzczogc3R5bGUuY3NzCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgc2VsZl9jb250YWluZWQ6IHllcwogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vCiAgICB0aGVtZTogY29zbW8KICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgd29yZF9kb2N1bWVudDoKICAgIHRvYzogeWVzCgotLS0KPHN0eWxlPgojVE9DIHsKICBiYWNrZ3JvdW5kOiB1cmwoImh0dHBzOi8vb3BlbmNhc2VzdHVkaWVzLmdpdGh1Yi5pby9pbWcvaWNvbi5wbmciKTsKICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47CiAgcGFkZGluZy10b3A6IDI0MHB4ICFpbXBvcnRhbnQ7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKfQo8L3N0eWxlPgoKCgoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoaW5jbHVkZSA9IFRSVUUsIGNvbW1lbnQgPSBOQSwgZWNobyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgY2FjaGUgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBvdXQud2lkdGggPSAnOTAlJykKbGlicmFyeShoZXJlKQpsaWJyYXJ5KGtuaXRyKQpgYGAKCgojIyMjIHsub3V0bGluZSB9CmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aCA9ICI4MDAgcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAibWFpbnBsb3QucG5nIikpCmBgYAoKIyMjIwoKIyMjIyB7LmRpc2NsYWltZXJfYmxvY2t9CgoqKkRpc2NsYWltZXIqKjogVGhlIHB1cnBvc2Ugb2YgdGhlIFtPcGVuIENhc2UgU3R1ZGllc10oaHR0cHM6Ly9vcGVuY2FzZXN0dWRpZXMuZ2l0aHViLmlvKXt0YXJnZXQ9Il9ibGFuayJ9IHByb2plY3QgaXMgKip0byBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIHZhcmlvdXMgZGF0YSBzY2llbmNlIG1ldGhvZHMsIHRvb2xzLCBhbmQgc29mdHdhcmUgaW4gdGhlIGNvbnRleHQgb2YgbWVzc3ksIHJlYWwtd29ybGQgZGF0YSoqLiBBIGdpdmVuIGNhc2Ugc3R1ZHkgZG9lcyBub3QgY292ZXIgYWxsIGFzcGVjdHMgb2YgdGhlIHJlc2VhcmNoIHByb2Nlc3MsIGlzIG5vdCBjbGFpbWluZyB0byBiZSB0aGUgbW9zdCBhcHByb3ByaWF0ZSB3YXkgdG8gYW5hbHl6ZSBhIGdpdmVuIGRhdGEgc2V0LCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjb250ZXh0IG9mIG1ha2luZyBwb2xpY3kgZGVjaXNpb25zIHdpdGhvdXQgZXh0ZXJuYWwgY29uc3VsdGF0aW9uIGZyb20gc2NpZW50aWZpYyBleHBlcnRzLiAKCiMjIyMKCiMjIyMgey5saWNlbnNlX2Jsb2NrfQoKVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLU5vbkNvbW1lcmNpYWwgMy4wIFsoQ0MgQlktTkMgMy4wKV0oaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLzMuMC91cy8pe3RhcmdldD0iX2JsYW5rIn0gIFVuaXRlZCBTdGF0ZXMgTGljZW5zZS4KCiMjIyMKCiMjIyMgey5yZWZlcmVuY2VfYmxvY2t9CgpUbyBjaXRlIHRoaXMgY2FzZSBzdHVkeSBwbGVhc2UgdXNlOgoKV3JpZ2h0LCBDYXJyaWUgYW5kIE9udGl2ZXJvcywgTWljaGFlbCBhbmQgSmFnZXIsIExlYWggYW5kIFRhdWIsIE1hcmdhcmV0IGFuZCBIaWNrcywgU3RlcGhhbmllLiAoMjAyMCkuIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuY2FzZXN0dWRpZXMvb2NzLWJwLWNvMi1lbWlzc2lvbnMuIEV4cGxvcmluZyBDTzIgZW1pc3Npb25zIGFjcm9zcyB0aW1lIChWZXJzaW9uIHYxLjAuMCkuCgojIyMjCgpUbyBhY2Nlc3MgdGhlIEdpdEh1YiByZXBvc2l0b3J5IGZvciB0aGlzIGNhc2Ugc3R1ZHkgc2VlIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS8vb3BlbmNhc2VzdHVkaWVzL29jcy1icC1jbzItZW1pc3Npb25zLgpUaGlzIGNhc2Ugc3R1ZHkgaXMgcGFydCBvZiBhIHNlcmllcyBvZiBwdWJsaWMgaGVhbHRoIGNhc2Ugc3R1ZGllcyBmb3IgdGhlIFtCbG9vbWJlcmcgQW1lcmljYW4gSGVhbHRoIEluaXRpYXRpdmVdKGh0dHBzOi8vYW1lcmljYW5oZWFsdGguamh1LmVkdS9vcGVuLWNhc2Utc3R1ZGllcykuCgoKIyAqKk1vdGl2YXRpb24qKgoqKiogCgoKIyMgKipDb250ZW50IEhlYWRlcioqCioqKiAKCkNvbnRlbnQgY29udGVudAoKCiMjIyAqKmNvbnRlbnQgaGVhZGVyIGFkZGl0aW9uYWwgbGV2ZWwqKgoqKioKCj4gQ29udGVudCBmb3IgcXVvdGVzCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoPSI4MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsImNvbnRlbnRfaW1hZ2UucG5nIikpCmBgYApmb3IgbGFyZ2UgaW1hZ2VzIGZyb20gdGhlIHdlYi4uLiBtaWdodCBkbyB0aGlzIGluc3RlYWQ6Cgo8cCBhbGlnbj0iY2VudGVyIj4KICA8aW1nIHdpZHRoPSI1MDAiIHNyYz0iaHR0cHM6Ly93d3cuZnJvbnRpZXJzaW4ub3JnL2ZpbGVzL0FydGljbGVzLzUwNTU3MC9mcHViaC0wOC0wMDAxNC1IVE1ML2ltYWdlX20vZnB1YmgtMDgtMDAwMTQtdDAwMi5qcGciPgo8L3A+CgojIyMjIyBbW3NvdXJjZV0oaHR0cHM6Ly93d3cuZnJvbnRpZXJzaW4ub3JnL2FydGljbGVzLzEwLjMzODkvZnB1YmguMjAyMC4wMDAxNC9mdWxsKV0KCjx1PlRvIHVuZGVybGluZSBzb21ldGhpbmc6PC91PiAgCioqQm9sZCoqICAKKkl0YWxpY3MqICAKPHU+Kip1bmRlcmxpbmUgYW5kIGJvbGQqKiA8L3U+ICAKPHU+KioqdW5kZXJsaW5lIGFuZCBib2xkIGFuZCBpdGFsaWNzKioqIDwvdT4gIAoKTGlzdDogIAoxKW1ha2VzdXJlIHRoZXJlIGFyZSB0d28gc3BhY2VzICAgIAoyKWFmdGVyIGVhY2ggaXRlbSB0byBjcmVhdGUgbmV3IGxpbmUgIAoKCiMjIyMgey5yZWZlcmVuY2VfYmxvY2t9CgpZYW5vc2t5LCBKLiBELiBldCBhbC4gU3BhdGlvLXRlbXBvcmFsIG1vZGVsaW5nIG9mIHBhcnRpY3VsYXRlIGFpciBwb2xsdXRpb24gaW4gdGhlIGNvbnRlcm1pbm91cyBVbml0ZWQgU3RhdGVzIHVzaW5nIGdlb2dyYXBoaWMgYW5kIG1ldGVvcm9sb2dpY2FsIHByZWRpY3RvcnMuICpFbnZpcm9uIEhlYWx0aCogMTMsIDYzICgyMDE0KS4KCiMjIyMKCgojICoqTWFpbiBRdWVzdGlvbnMqKgoqKiogCgojIyMjIHsubWFpbl9xdWVzdGlvbl9ibG9ja30KPGI+PHU+IE91ciBtYWluIHF1ZXN0aW9uOiA8L3U+PC9iPgoKMSkgUXVlc3Rpb24gMSAgCjIpIFF1ZXN0aW9uIDIgZXRjLgoKIyMjIwoKIyAqKkxlYXJuaW5nIE9iamVjdGl2ZXMqKiAKKioqIAoKSW4gdGhpcyBjYXNlIHN0dWR5LCB3ZSB3aWxsIGV4cGxvcmUgQ08yIGVtaXNzaW9uIGRhdGEgZnJvbSBhcm91bmQgdGhlIHdvcmxkLiAKV2Ugd2lsbCBhbHNvIGZvY3VzIG9uIHRoZSBVUyBzcGVjaWZpY2FsbHkgdG8gZXZhbHVhdGUgcGF0dGVybnMgb2YgdGVtcGVyYXR1cmVzIGFuZCBuYXR1cmFsIGRpc2FzdGVyIGFjdGl2aXR5LiAKClRoaXMgY2FzZSBzdHVkeSB3aWxsIHBhcnRpY3VsYXJseSBmb2N1cyBvbiBob3cgdG8gdXNlIGRpZmZlcmVudCBkYXRhc2V0cyB0aGF0IHNwYW4gZGlmZmVyZW50IHJhbmdlcyBvZiB0aW1lLCBhcyB3ZWxsIGFzIGhvdyB0byBjcmVhdGUgdmlzdWFsaXphdGlvbnMgb2YgcGF0dGVybnMgb3ZlciB0aW1lLiAKV2Ugd2lsbCBlc3BlY2lhbGx5IGZvY3VzIG9uIHVzaW5nIHBhY2thZ2VzIGFuZCBmdW5jdGlvbnMgZnJvbSB0aGUgW2B0aWR5dmVyc2VgXShodHRwczovL3d3dy50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSwgc3VjaCBhcyBgZHBseXJgLCBgdGlkeXJgLCBhbmQgYGdncGxvdDJgLiAKClRoZSB0aWR5dmVyc2UgaXMgYSBsaWJyYXJ5IG9mIHBhY2thZ2VzIGNyZWF0ZWQgYnkgUlN0dWRpby4gCldoaWxlIHNvbWUgc3R1ZGVudHMgbWF5IGJlIGZhbWlsaWFyIHdpdGggcHJldmlvdXMgUiBwcm9ncmFtbWluZyBwYWNrYWdlcywgdGhlc2UgcGFja2FnZXMgbWFrZSBkYXRhIHNjaWVuY2UgaW4gUiBlc3BlY2lhbGx5IGxlZ2libGUgYW5kIGludHVpdGl2ZS4KClRoZSBza2lsbHMsIG1ldGhvZHMsIGFuZCBjb25jZXB0cyB0aGF0IHN0dWRlbnRzIHdpbGwgYmUgZmFtaWxpYXIgd2l0aCBieSB0aGUgZW5kIG9mIHRoaXMgY2FzZSBzdHVkeSBhcmU6Cgo8dT4qKkRhdGEgU2NpZW5jZSBMZWFybmluZyBPYmplY3RpdmVzOioqPC91PiAgCgoxLiBJbXBvcnRpbmcgZGF0YSBmcm9tIHZhcmlvdXMgdHlwZXMgb2YgRXhjZWwgZmlsZXMgYW5kIENTViBmaWxlcwoyLiBBcHBseSBhY3Rpb24gdmVyYnMgaW4gYGRwbHlyYCBmb3IgZGF0YSB3cmFuZ2xpbmcKMy4gSG93IHRvIHBpdm90IGJldHdlZW4gImxvbmciIGFuZCAid2lkZSIgZGF0YXNldHMKNC4gSm9pbmluZyB0b2dldGhlciBtdWx0aXBsZSBkYXRhc2V0cyB1c2luZyBgZHBseXJgCjUuIEhvdyB0byBjcmVhdGUgZWZmZWN0aXZlIGxvbmdpdHVkaW5hbCBkYXRhIHZpc3VhbGl6YXRpb25zIHdpdGggYGdncGxvdDJgCjYuIEhvdyB0byBhZGQgdGV4dCwgY29sb3IsIGFuZCBsYWJlbHMgdG8gYGdncGxvdDJgIHBsb3RzCjcuIEhvdyB0byBjcmVhdGUgZmFjZXRlZCBgZ2dwbG90MmAgcGxvdHMKCjx1PioqU3RhdGlzdGljYWwgTGVhcm5pbmcgT2JqZWN0aXZlczoqKjwvdT4gIAoKMS4gSW50cm9kdWN0aW9uIHRvIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGFzIGEgc3VtbWFyeSBzdGF0aXN0aWMKMi4gUmVsYXRpb25zaGlwIGJldHdlZW4gY29ycmVsYXRpb24gYW5kIGxpbmVhciByZWdyZXNzaW9uCjMuIENvcnJlbGF0aW9uIGlzIG5vdCBjYXVzYXRpb24KCmBgYHtyLCBvdXQud2lkdGggPSAiMjAlIiwgZWNobyA9IEZBTFNFLCBmaWcuYWxpZ24gPSAiY2VudGVyIn0KaW5jbHVkZV9ncmFwaGljcygiaHR0cHM6Ly90aWR5dmVyc2UudGlkeXZlcnNlLm9yZy9sb2dvLnBuZyIpCmBgYAoKCioqKiAKCgpXZSB3aWxsIGJlZ2luIGJ5IGxvYWRpbmcgdGhlIHBhY2thZ2VzIHRoYXQgd2Ugd2lsbCBuZWVkOgoKYGBge3J9CmxpYnJhcnkoaGVyZSkKbGlicmFyeShyZWFkcikKbGlicmFyeShkcGx5cikKYGBgCgoKIFBhY2thZ2UgICB8IFVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLQpbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2plbm55YmMvaGVyZV9oZXJlKXt0YXJnZXQ9Il9ibGFuayJ9ICAgICAgIHwgdG8gZWFzaWx5IGxvYWQgYW5kIHNhdmUgZGF0YQpbcmVhZHJdKGh0dHBzOi8vcmVhZHIudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0gICAgICB8IHRvIGltcG9ydCB0aGUgQ1NWIGZpbGUgZGF0YQoKClRoZSBmaXJzdCB0aW1lIHdlIHVzZSBhIGZ1bmN0aW9uLCB3ZSB3aWxsIHVzZSB0aGUgYDo6YCB0byBpbmRpY2F0ZSB3aGljaCBwYWNrYWdlIHdlIGFyZSB1c2luZy4gVW5sZXNzIHdlIGhhdmUgb3ZlcmxhcHBpbmcgZnVuY3Rpb24gbmFtZXMsIHRoaXMgaXMgbm90IG5lY2Vzc2FyeSwgYnV0IHdlIHdpbGwgaW5jbHVkZSBpdCBoZXJlIHRvIGJlIGluZm9ybWF0aXZlIGFib3V0IHdoZXJlIHRoZSBmdW5jdGlvbnMgd2Ugd2lsbCB1c2UgY29tZSBmcm9tLgoKCiMgKipDb250ZXh0KioKKioqIAoKIyAqKkxpbWl0YXRpb25zKioKKioqIApUaGVyZSBhcmUgc29tZSBpbXBvcnRhbnQgY29uc2lkZXJhdGlvbnMgcmVnYXJkaW5nIHRoaXMgZGF0YSBhbmFseXNpcyB0byBrZWVwIGluIG1pbmQ6IAoKMSkgTGltaXRhdGlvbiAxICAKCjIpIExpbWl0YWl0b24gMiAgCgoKIyAqKldoYXQgYXJlIHRoZSBkYXRhPyoqCioqKiAKCklmIHlvdSB3YW50IHRvIG1ha2UgYSB0YWJsZSBhYm91dCB2YXJpYWJsZSBpbmZvOgoKVmFyaWFibGUgICB8IERldGFpbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLQoqKnZhcmlhYmxlMSoqICB8IFZhcmlhYmxlIGluZm8gIDxicj4gLS0gbW9yZSBkZXRhaWxzIDxicj4gLS0gbW9yZSBkZXRpYWxzIDxicj4gICoqRXhhbXBsZSoqOiBDb250ZW50IGNvbnRlbnQgIAoqKnZhcmlhYmxlMioqICB8IFZhcmlhYmxlIGluZm8gIDxicj4gLS0gbW9yZSBkZXRhaWxzIDxicj4gLS0gbW9yZSBkZXRpYWxzIDxicj4gICoqRXhhbXBsZSoqOiBDb250ZW50IGNvbnRlbnQKCiMgKipEYXRhIEltcG9ydCoqCioqKiAKClB1dCBmaWxlcyBpbiBkb2NzIGRpcmVjdG9yeSBhbmQgdXNlIGBoZXJlYCBwYWNrYWdlLgoKYGBge3J9CnBtIDwtcmVhZHI6OnJlYWRfY3N2KGhlcmUoImRvY3MiLCAicG0yNV9kYXRhLmNzdiIpKQpgYGAKCiMgKipEYXRhIEV4cGxvcmF0aW9uIGFuZCBXcmFuZ2xpbmcqKgoqKiogCgpXZSB3aWxsIGFsc28gdXNlIHRoZSBgJT4lYCBwaXBlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGRlZmluZSB0aGUgaW5wdXQgZm9yIGxhdGVyIHNlcXVlbnRpYWwgc3RlcHMuIFRoaXMgd2lsbCBtYWtlIG1vcmUgc2Vuc2Ugd2hlbiB3ZSBoYXZlIG11bHRpcGxlIHNlcXVlbnRpYWwgc3RlcHMgdXNpbmcgdGhlIHNhbWUgZGF0YSBvYmplY3QuIFRvIHVzZSB0aGUgcGlwZSBub3RhdGlvbiB3ZSBuZWVkIHRvIGluc3RhbGwgYW5kIGxvYWQgZHBseXIgYXMgd2VsbC4KCkNhbiBhZGQgRFQgdGFibGVzIHRvby0gbm90ZSB0aGF0IHlvdSBjYW5gdCB1c2UgdGhlc2UgaW5zaWRlIGEgY2xpY2sgZXhwYW5kIGRldGFpbHMgc2VjdGlvbi4KCmBgYHtyfQpsaWJyYXJ5KERUKQpEVDo6ZGF0YXRhYmxlKGlyaXMpCmBgYAoKU2Nyb2xsYWJsZSBjb250ZW50OgoKIyMjIyB7LnNjcm9sbGFibGUgfQpgYGB7cn0KIyBTY3JvbGwgdGhyb3VnaCB0aGUgb3V0cHV0IQpwbSAlPiUgCiAgZGlzdGluY3Qoc3RhdGUpICU+JQogIHByaW50KG4gPSAxZTMpCmBgYAojIyMjCgoKVG8gbWFrZSBjbGljayBleHBhbmQgc2VjdGlvbiB1c2U6Cgo8ZGV0YWlscz48c3VtbWFyeT4gQ2xpY2sgaGVyZSB0byBzZWUgbW9yZSBpbmZvIDwvc3VtbWFyeT4KCnRleHQgdGV4dAoKPC9kZXRhaWxzPgoKTm90ZSEhISBZb3UgY2Fubm90IHVzZSBzY3JvbGwgZmVhdHVyZXMgaW5zaWRlIGRldGFpbCBzZWN0aW9ucyB1bmxlc3MgaXQgaXMgdGhlIGxhc3QgaGVhZGVyIHNlY3Rpb24hIE90aGVyd2lzZSBpdCB3aWxsIGNhdXNlIHRoZSBvdGhlciBoZWFkZXJzIHRvIGJlIG1pc3NpbmcgYW5kIG90aGVyIGlzc3Vlcy4gCgpZb3UgY2FuIHN0aWxsIGRvIHRoaXMgaWYgeW91IGxlYXZlIGFuIG9wZW4gZGV0YWlscyBzZWN0aW9uIGxpa2UgdGhpcyBhbmQgdGhlbiBoYXZlIGEgc2VjdGlvbiBoZWFkZXIgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhpcyBzZWN0aW9uOgoKPGRldGFpbHM+PHN1bW1hcnk+IENsaWNrIGhlcmUgdG8gc2VlIG1vcmUgaW5mbyA8L3N1bW1hcnk+Cgp0ZXh0IHRleHQKClNjcm9sbGFibGUgY29udGVudDoKCiMjIyMgey5zY3JvbGxhYmxlIH0KYGBge3J9CiMgU2Nyb2xsIHRocm91Z2ggdGhlIG91dHB1dCEKcG0gJT4lIAogIGRpc3RpbmN0KHN0YXRlKSAlPiUKICBwcmludChuID0gMWUzKQpgYGAKIyMjIwoKCiMgKipEYXRhIFZpc3VhbGl6YXRpb24qKgoqKiogCgoKIyAqKkRhdGEgQW5hbHlzaXMqKgoqKiogCgojIyAqKmNvbnRlbnQgaGVhZGVyKioKKioqIAojIyMgKipjb250ZW50IGhlYWRlciBhZGRpdGlvbmFsIGxldmVsKioKKioqCgoKIyAqKlN1bW1hcnkqKgoqKiogCgojIyAqKlN5bm9wc2lzKioKKioqCiMjICoqU3VtbWFyeSBQbG90KioKKioqCgojIyAqKlN1Z2dlc3RlZCBIb21ld29yayoqCioqKiAKCgojICoqQWRkaXRpb25hbCBJbmZvcm1hdGlvbioqCioqKgoKIyMgKipIZWxwZnVsIExpbmtzKioKKioqIAoKcmV2aWV3IG9mIFt0aWR5bW9kZWxzXShodHRwczovL3J2aWV3cy5yc3R1ZGlvLmNvbS8yMDE5LzA2LzE5L2EtZ2VudGxlLWludHJvLXRvLXRpZHltb2RlbHMvKXt0YXJnZXQ9Il9ibGFuayJ9IAoKZ3VpZGUgZm9yIFtwcmVwcm9jZXNzaW5nIHdpdGggcmVjaXBlc10oaHR0cDovL3d3dy5yZWJlY2NhYmFydGVyLmNvbS9ibG9nLzIwMTktMDYtMDZfcHJlX3Byb2Nlc3NpbmcvKQoKW2d1aWRlXShodHRwczovL2JyaWF0dGUuZ2l0aHViLmlvL2dnY29yci8pIGZvciB1c2luZyBHR2FsbHkgdG8gY3JlYXRlIGNvcnJlbGF0aW9uIHBsb3RzCltndWlkZV0oaHR0cHM6Ly93d3cudGlkeXZlcnNlLm9yZy9ibG9nLzIwMTgvMTEvcGFyc25pcC0wLTAtMS8pIGZvciB1c2luZyBwYXJzbmlwIHRvIHRyeSBkaWZmZXJlbnQgYWxnb3JpdGhtcyBvciBlbmdpbmVzCltyZWNpcGUgZnVuY3Rpb25zXShodHRwczovL3RpZHltb2RlbHMuZ2l0aHViLmlvL3JlY2lwZXMvcmVmZXJlbmNlL2luZGV4Lmh0bWwpCgo8dT5UZXJtcyBhbmQgY29uY2VwdHMgY292ZXJlZDo8L3U+ICAKCltUaWR5dmVyc2VdKGh0dHBzOi8vd3d3LnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9ICAKW1JTdHVkaW8gY2hlYXRzaGVldHNdKGh0dHBzOi8vcnN0dWRpby5jb20vcmVzb3VyY2VzL2NoZWF0c2hlZXRzLyl7dGFyZ2V0PSJfYmxhbmsifSAgCltJbmZlcmVuY2VdKGh0dHBzOi8vd3d3LmJyaXRhbm5pY2EuY29tL3NjaWVuY2UvaW5mZXJlbmNlLXN0YXRpc3RpY3Mpe3RhcmdldD0iX2JsYW5rIn0gIApbUmVncmVzc2lvbl0oaHR0cHM6Ly9saW5kZWxvZXYuZ2l0aHViLmlvL3Rlc3RzLWFzLWxpbmVhci8pe3RhcmdldD0iX2JsYW5rIn0gIApbRGlmZmVyZW50IHR5cGVzIG9mIHJlZ3Jlc3Npb25dKGh0dHBzOi8vd3d3LmFuYWx5dGljc3ZpZGh5YS5jb20vYmxvZy8yMDE1LzA4L2NvbXByZWhlbnNpdmUtZ3VpZGUtcmVncmVzc2lvbi8pe3RhcmdldD0iX2JsYW5rIn0gIApbT3JkaW5hcnkgbGVhc3Qgc3F1YXJlcyBtZXRob2RdKGh0dHA6Ly9zZXRvc2EuaW8vZXYvb3JkaW5hcnktbGVhc3Qtc3F1YXJlcy1yZWdyZXNzaW9uLyl7dGFyZ2V0PSJfYmxhbmsifSAgCltSZXNpZHVhbF0oaHR0cHM6Ly93d3cuc3RhdGlzdGljc2hvd3RvLmRhdGFzY2llbmNlY2VudHJhbC5jb20vcmVzaWR1YWwvKXt0YXJnZXQ9Il9ibGFuayJ9ICAKCjx1PlBhY2thZ2VzIHVzZWQgaW4gdGhpcyBjYXNlIHN0dWR5OiA8L3U+CgogUGFja2FnZSAgIHwgVXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tCltoZXJlXShodHRwczovL2dpdGh1Yi5jb20vamVubnliYy9oZXJlX2hlcmUpe3RhcmdldD0iX2JsYW5rIn0gICAgICAgfCB0byBlYXNpbHkgbG9hZCBhbmQgc2F2ZSBkYXRhICAKW3JlYWRyXShodHRwczovL3JlYWRyLnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9ICAgICAgfCB0byBpbXBvcnQgdGhlIENTViBmaWxlIGRhdGEgIApbZHBseXJdKGh0dHBzOi8vZHBseXIudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0gICAgICB8IHRvIGFycmFuZ2UvZmlsdGVyL3NlbGVjdC9jb21wYXJlIHNwZWNpZmljIHN1YnNldHMgb2YgdGhlIGRhdGEgIApbc2tpbXJdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9za2ltci9pbmRleC5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9ICAgICAgfCB0byBnZXQgYW4gb3ZlcnZpZXcgb2YgZGF0YSAgIApbc3VtbWFyeXRvb2xzXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvc2tpbXIvaW5kZXguaHRtbCl7dGFyZ2V0PSJfYmxhbmsifSAgICAgIHwgdG8gZ2V0IGFuIG92ZXJ2aWV3IG9mIGRhdGEgaW4gYSBkaWZmZXJlbnQgc3R5bGUgICAKW3BkZnRvb2xzXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvcGRmdG9vbHMvcGRmdG9vbHMucGRmKXt0YXJnZXQ9Il9ibGFuayJ9ICAgfCB0byByZWFkIGEgUERGIGludG8gUiAgIApbbWFncml0dHJdKGh0dHBzOi8vbWFncml0dHIudGlkeXZlcnNlLm9yZy9hcnRpY2xlcy9tYWdyaXR0ci5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9ICAgfCB0byB1c2UgdGhlIGAlPD4lYCBwaXBwaW5nIG9wZXJhdG9yICAKW3B1cnJyXShodHRwczovL3B1cnJyLnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9ICAgICAgfCB0byBwZXJmb3JtIGZ1bmN0aW9ucyBvbiBhbGwgY29sdW1ucyBvZiBhIHRpYmJsZSAgIApbdGliYmxlXShodHRwczovL3RpYmJsZS50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSAgICAgfCB0byBjcmVhdGUgZGF0YSBvYmplY3RzIHRoYXQgd2UgY2FuIG1hbmlwdWxhdGUgd2l0aCAgZHBseXIvc3RyaW5nci90aWR5ci9wdXJyciAgClt0aWR5cl0oaHR0cHM6Ly90aWR5ci50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSAgICAgIHwgdG8gc2VwYXJhdGUgZGF0YSB3aXRoaW4gYSBjb2x1bW4gaW50byBtdWx0aXBsZSBjb2x1bW5zIApbZ2dwbG90Ml0oaHR0cHM6Ly9nZ3Bsb3QyLnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9ICAgIHwgdG8gbWFrZSB2aXN1YWxpemF0aW9ucyB3aXRoIG11bHRpcGxlIGxheWVycyAgCgojIyAqKlNlc3Npb24gSW5mbyoqCioqKgpgYGB7cn0KbGlicmFyeShkZXZ0b29scykKc2Vzc2lvbl9pbmZvKCkKYGBgCiMjICoqQWNrbm93bGVkZ21lbnRzKioKKioq